<?php
/**
 * Created by PhpStorm.
 * User: v_jingzhili
 * Date: 2019/3/28
 * Time: 17:54
 */


namespace Lib\Base;


class Page
{
    const LISTROW20 = 20;
    const LISTROW50 = 50;
    const LISTROW100 = 100;
    public $firstRow; // 起始行数
    public $listRows; // 列表每页显示行数
    public $parameter; // 分页跳转时要带的参数
    public $totalRows; // 总行数
    public $totalPages; // 分页总页面数
    public $rollPage = 8;// 分页栏每页显示的页数
    public $lastSuffix = true; // 最后一页是否显示总页数

    private $p = 'page'; //分页参数名
    private $url = ''; //当前链接URL
    private $nowPage = 1;

    // 分页显示定制
    private $config = array(
        'header' => ' 每页显示：%PAGE_LIST_SET%',
        'now_total' => '当前%NOW_PAGE%/%TOTAL_PAGE%页',
        'prev' => '<',
        'next' => '>',
        'list_select' => '跳转至 %LIST_PAGE_SELECT% 页',
        'page_ul' => '%UP_PAGE% %LINK_PAGE% %DOWN_PAGE%',
    );

    /**
     * 架构函数
     * @param array $totalRows 总的记录数
     * @param array $listRows 每页显示记录数
     * @param array $parameter 分页跳转的参数
     */
    public function __construct($totalRows, $listRows = 20, $parameter = array())
    {
        /* 基础设置 */
        $this->totalRows = $totalRows; //设置总记录数
        $this->listRows = $listRows;  //设置每页显示行数
        if (empty($parameter)) {
            $this->parameter = $_GET;
        } else {
            $parameter['limit'] = $this->listRows;
            $this->parameter = $parameter;
        }
        $this->nowPage = empty($_GET[$this->p]) ? 1 : intval($_GET[$this->p]);
        $this->nowPage = $this->nowPage > 0 ? $this->nowPage : 1;
        $this->firstRow = $this->listRows * ($this->nowPage - 1);
    }

    /**
     * 定制分页链接设置
     * @param string $name 设置名称
     * @param string $value 设置值
     */
    public function setConfig($name, $value)
    {
        if (isset($this->config[$name])) {
            $this->config[$name] = $value;
        }
    }

    /**
     * 生成链接URL
     * @param  integer $page 页码
     * @return string
     */
    private function url($page)
    {
        return str_replace(urlencode('[PAGE]'), $page, $this->url);
    }

    /**
     * 组装分页链接
     * @return string
     */
    public function show()
    {
        if (0 == $this->totalRows) {
            return '';
        }

        /* 生成URL */
        $this->parameter[$this->p] = '[PAGE]';
        $this->url = U(ACTION_NAME, $this->parameter);
        /* 计算分页信息 */
        $this->totalPages = ceil($this->totalRows / $this->listRows); //总页数
        if (!empty($this->totalPages) && $this->nowPage > $this->totalPages) {
            $this->nowPage = $this->totalPages;
        }
        /* 计算分页临时变量 */
        $now_cool_page = $this->rollPage / 2;
        $now_cool_page_ceil = ceil($now_cool_page);
        $this->lastSuffix && $this->config['last'] = $this->totalPages;
        //分页个数调整
        $page_num_set = '<span class="layui-laypage-limits"><select name="pagenumset" onchange="location.href= this.options[this.selectedIndex].value;">';
        $page_url_array = $this->parameter;
        unset($page_url_array['limit']);
        unset($page_url_array['page']);
        if ($this->listRows == self::LISTROW20) {
            $page_url_array['limit'] = self::LISTROW20;
            $page_num_set .= '<option value="' . U(ACTION_NAME,
                    $page_url_array) . '" selected>' . self::LISTROW20 . '</option>';
        } else {
            $page_url_array['limit'] = self::LISTROW20;
            $page_num_set .= '<option value="' . U(ACTION_NAME, $page_url_array) . '">' . self::LISTROW20 . '</option>';
        }
        if ($this->listRows == self::LISTROW50) {
            $page_url_array['limit'] = self::LISTROW50;
            $page_num_set .= '<option value="' . U(ACTION_NAME,
                    $page_url_array) . '" selected>' . self::LISTROW50 . '</option>';
        } else {
            $page_url_array['limit'] = self::LISTROW50;
            $page_num_set .= '<option value="' . U(ACTION_NAME, $page_url_array) . '">' . self::LISTROW50 . '</option>';
        }
        if ($this->listRows == self::LISTROW100) {
            $page_url_array['limit'] = self::LISTROW100;
            $page_num_set .= '<option value="' . U(ACTION_NAME,
                    $page_url_array) . '" selected>' . self::LISTROW100 . '</option>';
        } else {
            $page_url_array['limit'] = self::LISTROW100;
            $page_num_set .= '<option value="' . U(ACTION_NAME,
                    $page_url_array) . '">' . self::LISTROW100 . '</option>';
        }
        $page_num_set .= '</select></span>';
        //上一页
        $up_row = $this->nowPage - 1;
        $up_page = $up_row > 0 ? '<a class="layui-laypage-prev"  href="' . $this->url($up_row) . '">' . $this->config['prev'] . '</a>' : '';

        //下一页
        $down_row = $this->nowPage + 1;
        $down_page = ($down_row <= $this->totalPages) ? '<a class="layui-laypage-next" href="' . $this->url($down_row) . '">' . $this->config['next'] . '</a>' : '';

        //第一页
        $the_first = '';
        if ($this->totalPages > $this->rollPage && ($this->nowPage - $now_cool_page) >= 1) {
            $the_first = '<a class="layui-laypage-first" href="' . $this->url(1) . '">' . $this->config['first'] . '</a>';
        }

        //最后一页
        $the_end = '';
        if ($this->totalPages > $this->rollPage && ($this->nowPage + $now_cool_page) < $this->totalPages) {
            $the_end = '<a class="layui-laypage-last" href="' . $this->url($this->totalPages) . '">' . $this->config['last'] . '</a>';
        }

        //数字连接
        $link_page = "";
        $list_page_select = "<select name='listpageselect' onchange='location.href= this.options[this.selectedIndex].value;'>";
        for ($i = 1; $i <= $this->rollPage; $i++) {
            if (($this->nowPage - $now_cool_page) <= 0) {
                $page = $i;
            } elseif (($this->nowPage + $now_cool_page - 1) >= $this->totalPages) {
                $page = $this->totalPages - $this->rollPage + $i;
            } else {
                $page = $this->nowPage - $now_cool_page_ceil + $i;
            }
            if ($page > 0 && $page != $this->nowPage) {

                if ($page <= $this->totalPages) {
                    $link_page .= '<a class="num" href="' . $this->url($page) . '">' . $page . '</a>';
                    $list_page_select .= '<option value="' . $this->url($page) . '"> ' . $page . '</option>';
                } else {
                    break;
                }
            } else {
                if ($page > 0 && $this->totalPages != 1) {
                    if ($page == $this->nowPage) {
                        $list_page_select .= '<option value="' . $this->url($page) . '" selected> ' . $page . '</option>';
                    } else {
                        $list_page_select .= '<option value="' . $this->url($page) . '"> ' . $page . '</option>';
                    }
                    $link_page .= '<span class="layui-laypage-curr layui-disabled"><em class="layui-laypage-em"></em><em>' . $page . '</em></span>';

                }
            }
        }
        $list_page_select = $list_page_select . "</select>";

        //替换分页内容
        if ($this->totalRows <= self::LISTROW20) {
            return '';
        } else {
            $page_str = '<div class="layui-table-page" style="text-align:center;"><div class="layui-box layui-laypage layui-laypage-default">';
            if ($this->totalRows > $this->listRows) {
                $page_str .= str_replace(
                    array(
                        '%NOW_PAGE%',
                        '%UP_PAGE%',
                        '%DOWN_PAGE%',
                        '%FIRST%',
                        '%LINK_PAGE%',
                        '%END%',
                        '%TOTAL_ROW%',
                        '%TOTAL_PAGE%'
                    ),
                    array(
                        $this->nowPage,
                        $up_page,
                        $down_page,
                        $the_first,
                        $link_page,
                        $the_end,
                        $this->totalRows,
                        $this->totalPages
                    ),
                    $this->config['page_ul']);
                $page_str .= '<span class="layui-laypage-skip">' . str_replace(
                        array('%LIST_PAGE_SELECT%'),
                        array($list_page_select),
                        $this->config['list_select']) . '</span>';
            }
            $page_str .= '<span>' . str_replace(
                    array('%NOW_PAGE%', '%TOTAL_PAGE%'),
                    array($this->nowPage, $this->totalPages),
                    $this->config['now_total']) . '</span>';
            $page_str .= '<span>' . str_replace(
                    array('%PAGE_LIST_SET%'),
                    array($page_num_set),
                    $this->config['header']) . '</span></div></div>';

        }
        return "{$page_str}";
    }
}